home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-04-27 | 2.5 KB | 80 lines | [TEXT/????] |
- (load "/scmutils/math/vector.scm")
-
- (define (integrate f initial-states dt n integrator)
- (let ((step-map (integrator f dt)))
- (let loop ((n n) (states initial-states))
- (if (= n 0)
- states
- (loop (-1+ n) (cons (step-map states) states))))))
-
- (define (forward-euler f dt)
- (lambda (states)
- (let ((state (car states)))
- (add-vectors state
- (scalar*vector dt
- (f state))))))
-
- (define (backward-euler f dt)
- (lambda (states)
- (let ((state (car states)))
- (let ((predicted
- (add-vectors state
- (scalar*vector dt
- (f state)))))
- (add-vectors state
- (scalar*vector dt
- (f predicted)))))))
-
- (define (trapezoid f dt)
- (lambda (states)
- (let* ((state (car states))
- (d (f state))
- (predicted
- (add-vectors state
- (scalar*vector dt d))))
- (add-vectors state
- (scalar*vector (/ dt 2)
- (add-vectors (f predicted) d))))))
-
- (define (milne f dt)
- (let ((predictor (trapezoid f dt)))
- (lambda (states)
- (let* ((sn (car states))
- (sn-1 (cadr states))
- (predicted (predictor states)))
- (add-vectors sn-1
- (scalar*vector (/ dt 3)
- (add-vectors (f predicted)
- (scalar*vector 4 (f sn))
- (f sn-1))))))))
-
- (define (circle state)
- (vector (- (vector-ref state 1))
- (vector-ref state 0)))
-
- (define fe
- (reverse (integrate circle (list (vector 1 0)) .1 200 forward-euler)))
-
- (define be
- (reverse (integrate circle (list (vector 1 0)) .1 200 backward-euler)))
-
- (define tr
- (reverse (integrate circle (list (vector 1 0)) .1 200 trapezoid)))
-
- (define mr
- (reverse (integrate circle
- (integrate circle (list (vector 1 0)) .1 1 trapezoid)
- .1
- 199
- milne)))
-
- (define (show)
- (text-graphics 9)
- (draw-graph fe 'per-point connect-the-dots 'screen-box (left-half-box))
- (draw-graph be 'per-point connect-the-dots 'screen-box (right-half-box))
- (clear-box (left-half-box))
- (draw-graph tr 'per-point connect-the-dots 'screen-box (left-half-box))
- (clear-box (right-half-box))
- (draw-graph mr 'per-point connect-the-dots 'screen-box (right-half-box))
- (restore-video-mode))
-